﻿using System;
using System.Data;
using System.Data.Entity;
using System.Linq;
using System.Web.Mvc;
using SIBI.Models;
using PagedList;
using System.Net.Mail;
using System.Collections.Generic;
using System.IO;
using System.Net.Mime;

namespace SIBI.Controllers
{
    [Authorize]
    public class MovimientoController : Controller
    {
        private SIBIContext db = new SIBIContext();

        private TEJECUTIVOContext db1 = new TEJECUTIVOContext();

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Index()													 						*//
        // Función que devuelve la vista de todos los movimientos realizados sobre todos	*// 
        // los BIs de la empresa.                                                           *//
        // _________________________________________________________________________________*//
        // Entrada: None                                        							*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los movimientos de los                            *//
        // bienes informáticos                                           					*//
        // _________________________________________________________________________________*//

        //
        // GET: /Movimiento/

        public ViewResult Index()
        {
            var movimientoes = db.Movimientoes.Include(m => m.ncmo).Include(m => m.nbin);
            return View(movimientoes.ToList());
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // SearchIndex()		Acceso INVITADO	y ADMINISTRADOR								*//
        // Acción que devuelve la vista de todos los movimientos de BI listados,            *//
        // paginados y con opción de búsqueda.		 										*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la ultima búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los movimientos de los bienes informáticos        *//
        // listados                                                             			*//
        // _________________________________________________________________________________*//
        //***********************************************************************************//
        //****                        INICIO  PROYECTO SIBI V.1.0                         ***//
        //****                             Adrian Di Puglia                               ***//
        //***********************************************************************************//
        public ActionResult SearchIndex(/*correo*/string msnCorreo, string HijosChange,
                                string seriales, string currentSerial,
                                string searchSerial, string currentUbi,
                                string searchUbi, string currentCausa,
                                string searchCausa, DateTime? currentFechaIni,
                                DateTime? searchFechaIni, DateTime? currentFechaFinal,
                                DateTime? searchFechaFinal, int? page = 1)
        {

            var mov = db.Movimientoes.Include(m => m.ncmo).Include(m => m.nbin);


            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchFechaIni = currentFechaIni;
                searchFechaFinal = currentFechaFinal;
                searchUbi = currentUbi;
                searchCausa = currentCausa;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentFechaIni = searchFechaIni;
            ViewBag.CurrentFechaFinal = searchFechaFinal;
            ViewBag.CurrentUbi = searchUbi;
            ViewBag.CurrentCausa = searchCausa;
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.HijosChange = HijosChange;
            ViewBag.seriales = seriales;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            if (!String.IsNullOrEmpty(searchSerial))
            {
                mov = mov.Where(s => s.nbin.BienInformaticoId.Contains(searchSerial));
            }

            /*Busqueda por Rango de Fecha de Movimiento Inicial DESDE*/
            if ((!String.IsNullOrEmpty(searchFechaIni.ToString())) && (String.IsNullOrEmpty(searchFechaFinal.ToString())))
            {
                mov = mov.Where(s => s.dfmo == searchFechaIni);
            }

            /*Busqueda por Rango de Fecha de Movimiento Inicial DESDE - HASTA*/
            if ((!String.IsNullOrEmpty(searchFechaIni.ToString())) && (!String.IsNullOrEmpty(searchFechaFinal.ToString())))
            {
                mov = mov.Where(s => s.dfmo >= searchFechaIni);
                mov = mov.Where(s => s.dfmo <= searchFechaFinal);
            }

            if (!String.IsNullOrEmpty(searchUbi))
            {
                mov = mov.Where(s => s.cubf.Contains(searchUbi));
            }

            if (!String.IsNullOrEmpty(searchCausa))
            {
                mov = mov.Where(s => s.ncmo.cnom.Contains(searchCausa));
            }

            mov = mov.OrderByDescending(x => x.dfmo);
            return View(mov.ToPagedList(pageIndex, pageSize));
        }
        //***********************************************************************************//
        //****                          FIN  PROYECTO SIBI V.1.0                          ***//
        //***********************************************************************************//



        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // MovimientoAsignacion()	Acceso solo ADMINISTRADOR					    		*//
        // Acción que devuelve la vista para asignar un Movimientos de un BI nuevo.         *//
        // Método POST.                     |                               				*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la última búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los movimientos BI asignado.							*//
        // _________________________________________________________________________________*//

        [Authorize(Roles = "Admin")]
        //--------------------------BUSCADOR Movimiento Asignación ---------------------------\\
        public ActionResult MovimientoAsignacion(string currentObj, string searchClaseObjeto,
                            /*correo*/string msnCorreo, string currentSerial, 
                                        string searchSerial, string currentTipo, 
                                        string searchTipo, string currentAct, 
                                        string searchAct, int? page = 1)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchAct = currentAct;
                searchTipo = currentTipo;
                searchClaseObjeto = currentObj;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.CurrentObj = searchClaseObjeto;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Resguardados
            bi = bi.Where(s => s.EstadoId == 2);

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            bi = bi.OrderBy(x => x.BienInformaticoId);
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // MovimientoPrestamo()	Acceso solo ADMINISTRADOR						    		*//
        // Acción que devuelve la vista con la realización del movimiento de préstamo.      *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la última búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los movimientos BI préstados.						*//
        // _________________________________________________________________________________*//

        [Authorize(Roles = "Admin")]
        //----------------------------- BUSCADOR Movimiento Prestamo ---------------------------\\
        public ActionResult MovimientoPrestamo(string currentObj, string searchClaseObjeto,
                            /*correo*/string msnCorreo, string currentSerial, 
                            string searchSerial, string currentTipo, 
                            string searchTipo, string currentUbi, 
                            string searchUbi, int? page = 1)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchUbi = currentUbi;
                searchTipo = currentTipo;
                searchClaseObjeto = currentObj;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchUbi;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.CurrentObj = searchClaseObjeto;

            ViewBag.msnCorreo = msnCorreo;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Resguardados
            bi = bi.Where(s => s.EstadoId == 2);

            //Filtrado de lista de Bienes Informáticos, solo Activos Fijos
            //bi = bi.Where(s => s.TipoBienId == 2);
            
            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchUbi))
            {
                bi = bi.Where(s => s.nanf.Contains(searchUbi));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            bi = bi.OrderBy(x => x.BienInformaticoId);
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // MovimientoTransferencia()	Acceso solo ADMINISTRADOR					 		*//
        // Acción que devuelve la vista con la realización del movimiento de transferencia. *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la última búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los movimientos BI transferencia.			    	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        //----------------------------- BUSCADOR Movimiento Transferencia---------------------------\\
        public ActionResult MovimientoTransferencia(/*correo*/string msnCorreo, string currentSerial, 
                            string searchSerial, string currentEst, 
                            string searchEst, string currentTipo, 
                            string searchTipo, string currentUbi, 
                            string searchUbi, string currentAct, 
                            string searchAct, string currentRes, 
                            string searchRes, int? page = 1)
        {            

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchUbi = currentUbi;
                searchEst = currentEst;
                searchTipo = currentTipo;

                searchAct = currentAct;
                searchRes = currentRes;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchUbi;
            ViewBag.CurrentEst = searchEst;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.msnCorreo = msnCorreo;

            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentRes = searchRes;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Asignados y Prestados
            bi = bi.Where(s => s.EstadoId == 1 || s.EstadoId == 4);

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchUbi))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchUbi));
            }

            if (!String.IsNullOrEmpty(searchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(searchEst));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(searchRes));
            }

            bi = bi.OrderBy(x => x.BienInformaticoId);

            //Ordenar los BI del return
            bi = bi.OrderBy(x => x.BienInformaticoId);
            List<BienInformatico> lbi;
            if (bi.Count() > 10)
                if (bi.Count() - (pageIndex * pageSize) < 11)
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count() - (pageIndex * pageSize));
                else
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, pageSize);
            else
                lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count());
            List<string> localidades = new List<string>();
            var i = 1;
            foreach (var bbii in lbi)
            {
                if (i > pageSize) break;
                if (bbii.ncar == null)
                {
                    try
                    {
                        localidades.Add(
                                        (from loc in db1.LOCALIDAD
                                         where loc.localidad_id == bbii.localidad_id
                                         select loc.localidad_nombre).First().ToString()
                                       );
                    }
                    catch
                    {
                        localidades.Add("");
                    }
                }
                else
                {
                    localidades.Add("");
                }
                i = i + 1;
            }

            ViewBag.Localidades = localidades;
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // ReemplazoResguardo()	Acceso solo ADMINISTRADOR			        		 		*//
        // Acción que devuelve la vista con la realización del reemplazo resguardo.         *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el numero de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la última búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el reemplazo resguardo.			                	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        //----------------------------- BUSCADOR Retiro Resguardo ---------------------------\\
        public ActionResult ReemplazoResguardo(int? tipoRes, string currentSerial, 
                            string searchSerial, string currentEst, 
                            string searchEst, string currentTipo, 
                            string searchTipo, string currentUbi, 
                            string searchClaseObjeto, string currentAct, 
                            string searchAct, string currentRes, 
                            string searchRes, int? page = 1)
        {

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchClaseObjeto = currentUbi;
                searchEst = currentEst;
                searchTipo = currentTipo;
                ViewBag.tipoRes = tipoRes;

                searchAct = currentAct;
                searchRes = currentRes;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentUbi = searchClaseObjeto;
            ViewBag.CurrentEst = searchEst;
            ViewBag.CurrentTipo = searchTipo;
            ViewBag.tipoRes = tipoRes;

            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentRes = searchRes;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Asignados y Prestados
            bi = bi.Where(s => s.EstadoId == 1 || s.EstadoId == 4);


            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchClaseObjeto))
            {
                bi = bi.Where(s => s.nmym.ncob.cnom.Contains(searchClaseObjeto));
            }

            if (!String.IsNullOrEmpty(searchEst))
            {
                bi = bi.Where(s => s.nest.cnom.Contains(searchEst));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchRes))
            {
                bi = bi.Where(s => s.ncar.empleados.Contains(searchRes));
            }

            bi = bi.OrderBy(x => x.BienInformaticoId);
            List<string> localidades = new List<string>();
            List<BienInformatico> lbi;
            if (bi.Count() > 10)
                if (bi.Count() - (pageIndex * pageSize) < 11)
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count() - (pageIndex * pageSize));
                else
                    lbi = bi.ToList().GetRange(pageIndex * pageSize, pageSize);
            else
                lbi = bi.ToList().GetRange(pageIndex * pageSize, bi.Count());
            var i = 1;
            foreach (var bbii in lbi)
            {
                if (i > pageSize) break;
                if (bbii.ncar == null)
                {
                    try
                    {
                        localidades.Add(
                                        (from loc in db1.LOCALIDAD
                                         where loc.localidad_id == bbii.localidad_id
                                         select loc.localidad_nombre).First().ToString()
                                       );
                    }
                    catch
                    {
                        localidades.Add("");
                    }
                }
                else
                {
                    localidades.Add("");
                }
                i = i + 1;
            }

            ViewBag.Localidades = localidades;
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // MovimientoAsignacionReem()	Acceso solo ADMINISTRADOR					 		*//
        // Acción que devuelve la vista con la realización del movimiento de reemplazo.     *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico de 	*//
        //		notificación de movimiento o  no.											*//
        // •	Page: entero que denota el número de pagina que se tiene en la lista de 	*//
        // 		búsqueda, por defecto es 1.													*//
        // •	Parámetros con prefijo search: caracteres por los cuales se va a filtrar la *//
        // 		búsqueda. 																	*//
        // •	Parámetros con prefijo current: caracteres que guardan la última búsqueda de*// 
        // 		filtrado para mantenerla durante los cambios de página. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve los movimiento de reemplazo.		        	    	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        //----------------------------- BUSCADOR Movimiento Asignación Reemplazo ---------------------------\\
        public ActionResult MovimientoAsignacionReem(/*correo*/string msnCorreo, string idRes, 
                            string cargoRes, string cecoRes, 
                            string divisionRes, string localidadRes, 
                            string ubiRes, int? padreRes, 
                            string ClaseRes, string correoRes, 
                            string currentSerial, string searchSerial, 
                            string currentTipo, string searchTipo, 
                            string currentAct, string searchAct, 
                            int? page = 1)
        {

            ViewBag.idRes = idRes;
            ViewBag.cargoRes = cargoRes;
            ViewBag.cecoRes = cecoRes;
            ViewBag.divisionRes = divisionRes;
            ViewBag.localidadRes = localidadRes;
            ViewBag.ubiRes = ubiRes;
            ViewBag.padreRes = padreRes;
            ViewBag.correoRes = correoRes;
            ViewBag.msnCorreo = msnCorreo;

            var bi = db.BienInformaticoes.Include(b => b.nest).Include(b => b.ntib).Include(b => b.nsoc).Include(b => b.ndiv).Include(b => b.ncar).Include(b => b.nmym);

            if (Request.HttpMethod == "GET")
            {
                searchSerial = currentSerial;
                searchAct = currentAct;
                searchTipo = currentTipo;
            }
            else
            {
                page = 1;
            }
            ViewBag.CurrentSerial = searchSerial;
            ViewBag.CurrentAct = searchAct;
            ViewBag.CurrentTipo = searchTipo;

            int pageSize = 10;
            int pageIndex = (page ?? 1) - 1;

            //Filtrado de lista de Bienes Informáticos, solo Resguardados
            bi = bi.Where(s => s.EstadoId == 2);

            //Filtrado de lista de Bienes Informáticos, todos menos el ResguardadoaPrevio
            bi = bi.Where(s => s.BienInformaticoId!=idRes);

            //Filtrado de lista de Bienes Informáticos, todos de al misma clase de Objeto
            bi = bi.Where(s => s.nmym.ncob.cnom == ClaseRes);

            if (!String.IsNullOrEmpty(searchSerial))
            {
                bi = bi.Where(s => s.BienInformaticoId.Contains(searchSerial));
            }

            if (!String.IsNullOrEmpty(searchAct))
            {
                bi = bi.Where(s => s.nanf.Contains(searchAct));
            }

            if (!String.IsNullOrEmpty(searchTipo))
            {
                bi = bi.Where(s => s.ntib.cnom.Contains(searchTipo));
            }

            bi = bi.OrderBy(x => x.BienInformaticoId);
            return View(bi.ToPagedList(pageIndex, pageSize));
        }

        //***********************************************************************************//
        // Autor:  								                		     				*//
        //***********************************************************************************//
        // Details()	Acceso INVITADO	y ADMINISTRADOR										*//
        // Función que devuelve la vista de los detalles de un movimiento BI especificado.	*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver los detalles. 					*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee todos los datos de los movimientos BI deseado.			*//
        // _________________________________________________________________________________*//
        // GET: /Movimiento/Details/5

        public ViewResult Details(int id)
        {
            Movimiento movimiento = db.Movimientoes.Find(id);
            return View(movimiento);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Create()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite crear un Movimientos especificado.      *//
        // Método GET	                                                                    *//
        // _________________________________________________________________________________*//
        // Entrada: 		none															*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para crear un movimiento.		            *//
        // _________________________________________________________________________________*//
        //
        // GET: /Movimiento/Create
        [Authorize(Roles = "Admin")]
        public ActionResult Create()
        {
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre");
            ViewBag.CausaMovimientoId = new SelectList(db.CausaMovimientoes, "CausaMovimientoId", "cnom");
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId");
            return View();
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // Create()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite crear un Movimientos especificado.      *//
        // Método POST	                                                                    *//
        // _________________________________________________________________________________*//
        // Entrada: 		none															*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que posee la plantilla para crear un movimiento.		            *//
        // _________________________________________________________________________________*//
        //
        // POST: /Movimiento/Create
        // TODO: Eliminar
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(Movimiento movimiento)
        {
            movimiento.dmov = DateTime.Now.Date;

            if (ModelState.IsValid)
            {
                db.Movimientoes.Add(movimiento);
                db.SaveChanges();
                return RedirectToAction("Index");  
            }

            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", movimiento.localidad_id);
            ViewBag.CausaMovimientoId = new SelectList(db.CausaMovimientoes, "CausaMovimientoId", "cnom", movimiento.CausaMovimientoId);
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", movimiento.BienInformaticoId);
            return View(movimiento);
        }

        //***********************************************************************************//
        // Autor:  										     	                			*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite editar un Movimiento BI especificado.   *//
        // Método GET.	                                                                    *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea editar.								*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para editar un Movimiento BI.       	*//
        // _________________________________________________________________________________*//
        //
        // GET: /Movimiento/Edit/5
        [Authorize(Roles = "Admin")]
        public ActionResult Edit(int id)
        {
            Movimiento movimiento = db.Movimientoes.Find(id);

            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", movimiento.localidad_id);
            ViewBag.CausaMovimientoId = new SelectList(db.CausaMovimientoes, "CausaMovimientoId", "cnom", movimiento.CausaMovimientoId);
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", movimiento.BienInformaticoId);
            return View(movimiento);
        }

        //***********************************************************************************//
        // Autor:  										     	                			*//
        //***********************************************************************************//
        // Edit()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite editar un Movimiento BI especificado.   *//
        // Método POST.	                                                                    *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea editar.								*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para editar un Movimiento BI.       	*//
        // _________________________________________________________________________________*//
        //
        // POST: /Movimiento/Edit/5
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Edit(Movimiento movimiento)
        {
            if (ModelState.IsValid)
            {
                db.Entry(movimiento).State = EntityState.Modified;
                db.SaveChanges();
                return RedirectToAction("SearchIndex");
            }

            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", movimiento.localidad_id);
            ViewBag.CausaMovimientoId = new SelectList(db.CausaMovimientoes, "CausaMovimientoId", "cnom", movimiento.CausaMovimientoId);
            ViewBag.BienInformaticoId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", movimiento.BienInformaticoId);
            return View(movimiento);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // Delete()	Acceso solo ADMINISTRADOR												*//
        // Acción que devuelve la vista que permite elimininar un Movimiento especificado. 	*//
        // Método GET.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Cargo que se desea eliminar.							*//
        // _________________________________________________________________________________*//
        // Salida: Vista que posee la plantilla para eliminar el movimiento deseado.	    *//
        // _________________________________________________________________________________*//
        //
        // GET: /Movimiento/Delete/5
        [Authorize(Roles = "Admin")]
        public ActionResult Delete(int id)
        {
            Movimiento movimiento = db.Movimientoes.Find(id);
            return View(movimiento);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // DeleteConfirmed()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista que permite elimininar un Movimiento especificado. 	*//
        // Método POST.																		*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del Cargo que va a eliminar.								*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que muestra la eliminación de un movimiento deseado.				*//
        // _________________________________________________________________________________*//
        //
        [Authorize(Roles = "Admin")]
        [HttpPost, ActionName("Delete")]
        public ActionResult DeleteConfirmed(int id)
        {            
            Movimiento movimiento = db.Movimientoes.Find(id);
            db.Movimientoes.Remove(movimiento);
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // PreviewAsignacion()	Acceso solo ADMINISTRADOR									*//
        // Acción que devuelve la vista del preview de la asignación de un Movimiento       *//
        // Bien Informático.	                                                            *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico o no *//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview de la asignación realizada sobre el       *//
        // movimiento.				                                                        *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewAsignacion(string id, /*correo*/string msnCorreo)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            ViewBag.localidad_id = localidad;
            ViewBag.msnCorreo = msnCorreo;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // PreviewTransferenciaM()	Acceso solo ADMINISTRADOR								*//
        // Acción que devuelve la vista del preview de la transferencia de movimiento.      *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico o no *//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview de la transferencia de movimiento.        *//			                                                        *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewTransferenciaM(string id, /*correo*/string msnCorreo, 
                        string seriales, string LocalidadIdV, 
                        string CecoIdV, string CargoIdV, string DivisionIdV)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            var ceco = from m in db1.CECO
                       where m.ceco_id == bieninformatico.ceco_id
                       select m.ceco_descripcion;

            var cecoV = from m in db1.CECO
                       where m.ceco_id == CecoIdV
                       select m.ceco_descripcion;

            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            var localidadV = from m in db1.LOCALIDAD
                            where m.localidad_id == LocalidadIdV
                            select m.localidad_nombre;

            var cargo = from m in db.Cargoes
                        where m.CargoId == CargoIdV
                        select m.cdes;
            var division = from m in db.Divisions
                        where m.DivisionId == DivisionIdV
                        select m.cper;

            ViewBag.ceco_id = ceco;
            ViewBag.localidad_id = localidad;
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.LocalidadIdV = localidadV;
            ViewBag.CecoIdv = cecoV;
            ViewBag.CargoIdv = cargo;
            ViewBag.DivisionIdv = division;
            ViewBag.Seriales = seriales;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                     				*//
        //***********************************************************************************//
        // PreviewReemplazoM()	Acceso solo ADMINISTRADOR						    		*//
        // Acción que devuelve la vista del preview del reemplazo de movimiento.            *//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	id: identificador del BI que se desea ver el preview 						*//
        // •	msnCorreo: mensaje que indica si se logró enviar el correo electrónico o no *//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve el preview del reemplazo de movimiento.              *//			                                                        *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PreviewReemplazoM( string id, string idRes, 
                        /*correo*/string msnCorreo, string HijosChange, 
                                    string LocalidadIdV, string CecoIdV, 
                                    string CargoIdV, string DivisionIdV)
        {

            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            var serial = from m in db.BienInformaticoes
                        where m.BienInformaticoId == idRes
                        select m.BienInformaticoId;


            var ceco = from m in db1.CECO
                       where m.ceco_id == bieninformatico.ceco_id
                       select m.ceco_descripcion;

            var cecoV = from m in db1.CECO
                        where m.ceco_id == CecoIdV
                        select m.ceco_descripcion;

            var localidad = from m in db1.LOCALIDAD
                            where m.localidad_id == bieninformatico.localidad_id
                            select m.localidad_nombre;

            var localidadV = from m in db1.LOCALIDAD
                             where m.localidad_id == LocalidadIdV
                             select m.localidad_nombre;

            var cargo = from m in db.Cargoes
                        where m.CargoId == CargoIdV
                        select m.cdes;
            var division = from m in db.Divisions
                           where m.DivisionId == DivisionIdV
                           select m.cper;


            ViewBag.serial = serial;
            ViewBag.ceco_id = ceco;
            ViewBag.localidad_id = localidad;
            ViewBag.msnCorreo = msnCorreo;
            ViewBag.LocalidadIdV = localidadV;
            ViewBag.CecoIdv = cecoV;
            ViewBag.CargoIdv = cargo;
            ViewBag.DivisionIdv = division;
            ViewBag.HijosChange = HijosChange;

            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // AsignacionM()	Acceso solo ADMINISTRADOR										*//
        // Acción que devuelve la vista para asignar un movmiento de un BI nuevo.           *//
        // Método GET.				                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un movmiento de un BI.		*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult AsignacionM( string id)
        {
            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            bieninformatico.cubf = null;

            ViewBag.PadreId = "";
            ViewBag.ceco_id = "";
            ViewBag.localidad_id = "";

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);

            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper");
            ViewBag.CargoId = "";
            ViewBag.ceco_id_Visible = (from m in db1.CECO
                                       where m.ceco_id == bieninformatico.ceco_id
                                       select m.ceco_descripcion).FirstOrDefault();

            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // AsignacionM()	Acceso solo ADMINISTRADOR										*//
        // Acción que devuelve la vista para asignar un movmiento de un BI nuevo.           *//
        // Método POST.				                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un movmiento de un BI.		*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult AsignacionM(BienInformatico bieninformatico, 
                                        string nombre, 
                                        string LocalidadIdV, 
                                        string ceco_idV, 
                                        int? EstadoIdV, 
                                        int? DivisionIdV, 
                                        string CargoIdV, 
                                        string ClaseIdV, /*correo*/
                                        string email, 
                                        string subject, 
                                        string body,/*correos*/
                                        string ceco_id_Visible,
                                        string CargoId_Visible,
                                        string localidad_id_Visible
                                        )
        {
           
            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;

            if(bieninformatico.BienInformaticoId!=bieninformatico.PadreId){

                    /*correo*/
                    if (email != string.Empty)
                    {

                        if (ModelState.IsValid)
                        {

                            db.Entry(bieninformatico).State = EntityState.Modified;
                            db.SaveChanges();

                            var cargoN = (from m in db.Cargoes
                                          where m.CargoId == bieninformatico.CargoId
                                          select m).ToList().FirstOrDefault();
                            var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                            // Carga Movimiento
                            creacionMovimiento("Entrada", obs, bieninformatico.cubf,
                                    bieninformatico.localidad_id, bieninformatico.EstadoId,
                                        bieninformatico.BienInformaticoId);

                            //--------------------------------  Envio de Correo  ------------------------------\\
                            var msnCorreo = "";

                            var localidad = (from m in db1.LOCALIDAD
                                             where m.localidad_id == bieninformatico.localidad_id
                                             select m.localidad_nombre).ToList();

                            var cargo = (from c in db.Cargoes
                                         where c.CargoId == bieninformatico.CargoId
                                         select c.cdes).ToList();

                            //Obtención de la marca modelo
                            var marcaModelo = (from c in db.MarcaModeloes
                                               where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                               select c.ncob.cnom).ToList();

                            var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                            var bodySend = " el traslado del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                           "' a la localidad " + localidad.FirstOrDefault() + ", asignado al cargo "
                                           + cargo.FirstOrDefault() + ".  <br /><br />" + body;

                            var cc = (from m in db.ControlCorreos
                                      where m.CausaMovimientoId == bieninformatico.EstadoId
                                      select m.ccor).First();

                            if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                            try
                            {
                                sendEmail(cc, subjectSend, bodySend, true);
                                if (envioCorreo) sendEmail(email, subjectSend, bodySend, true);
                                msnCorreo = "Se envió el correo satisfactoriamente";
                            }
                            catch (Exception)
                            {
                                msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                            }
                            //--------------------------------  FIN Envio de Correo  ------------------------------\\

                            return RedirectToAction("PreviewAsignacion", /*correo*/ new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
                        }
                    }
                    else
                        ViewBag.FailCorreo = "Debe Rellenar Correo de Usuario"; 
            }
            else
                ViewBag.FailPadre = "No se puede seleccionar el mismo Bien como Padre";

            /*correo*/
            ViewBag.email = email;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            ViewBag.ceco_id_Visible = ceco_id_Visible;
            ViewBag.CargoId_Visible = CargoId_Visible;
            ViewBag.localidad_id_Visible = localidad_id_Visible;

            ViewBag.nombre = nombre;

            ViewBag.PadreId = bieninformatico.PadreId;
            ViewBag.ceco_id = bieninformatico.ceco_id;
            //ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre");
            ViewBag.localidad_id = bieninformatico.localidad_id;

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", ceco_idV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", DivisionIdV);

            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }


        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // PrestamoM()	Acceso solo ADMINISTRADOR			    							*//
        // Acción que devuelve la vista para asignar un movimiento de un BI nuevo.          *//
        // Método GET.				                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un movimiento de un BI.	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult PrestamoM( string id)
        {
            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            bieninformatico.dfpr = DateTime.Now.Date;
            bieninformatico.cubf = null;

            ViewBag.PadreId = "";
            ViewBag.ceco_id = "";
            ViewBag.localidad_id = "";

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);

            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 4);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper");
            ViewBag.CargoId = "";
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // PrestamoM()	Acceso solo ADMINISTRADOR			    							*//
        // Acción que devuelve la vista para asignar un movimiento de un BI nuevo.          *//
        // Método POST.				                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para asignar un movimiento de un BI.	*//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult PrestamoM(BienInformatico bieninformatico, 
                                        string nombre, 
                                        string LocalidadIdV, 
                                        string ceco_idV, 
                                        int? EstadoIdV, 
                                        int? DivisionIdV, 
                                        string CargoIdV, 
                                        string ClaseIdV,/*correo*/
                                        string email, 
                                        string subject, 
                                        string body,/*correos*/
                                        string ceco_id_Visible,
                                        string CargoId_Visible,
                                        string localidad_id_Visible
                                        )
        {

            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;

            if(bieninformatico.BienInformaticoId!=bieninformatico.PadreId){

                /*correo*/
                if (email != string.Empty)
                {

                    if (ModelState.IsValid)
                    {

                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.SaveChanges();

                        var cargoN = (from m in db.Cargoes
                                      where m.CargoId == bieninformatico.CargoId
                                      select m).ToList().FirstOrDefault();
                        var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                        // Carga Movimiento
                        creacionMovimiento("Entrada", obs, bieninformatico.cubf,
                                bieninformatico.localidad_id, bieninformatico.EstadoId,
                                    bieninformatico.BienInformaticoId);

                        //--------------------------------  Envio de Correo  ------------------------------\\
                        var msnCorreo = "";

                        var localidad = (from m in db1.LOCALIDAD
                                         where m.localidad_id == bieninformatico.localidad_id
                                         select m.localidad_nombre).ToList();

                        var cargo = (from c in db.Cargoes
                                     where c.CargoId == bieninformatico.CargoId
                                     select c.cdes).ToList();

                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();

                        var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                        var bodySend = " el traslado del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                       "' a la localidad " + localidad.FirstOrDefault() + ", asignado al cargo "
                                       + cargo.FirstOrDefault() + ", para formalizar el proceso de préstamo.  <br /><br />"
                                       + body;

                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                        try
                        {
                            sendEmail(cc, subjectSend, bodySend, true);
                            if (envioCorreo) sendEmail(email, subjectSend, bodySend, true);
                            msnCorreo = "Se envió el correo satisfactoriamente";
                        }
                        catch (Exception)
                        {
                            msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                        }
                        //--------------------------------  FIN Envio de Correo  ------------------------------\\

                        return RedirectToAction("PreviewAsignacion", /*correo*/ new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo });
                    }
                }
                else
                    ViewBag.FailCorreo = "Debe Rellenar Correo";
        }
        else
            ViewBag.FailPadre = "No se puede seleccionar el mismo Bien como Padre";

            /*correo*/
            ViewBag.email = email;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

            ViewBag.nombre = nombre;

            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            ViewBag.ceco_id_Visible = ceco_id_Visible;
            ViewBag.CargoId_Visible = CargoId_Visible;
            ViewBag.localidad_id_Visible = localidad_id_Visible;

            bieninformatico.dfpr = DateTime.Now.Date;

            ViewBag.PadreId = bieninformatico.PadreId;
            ViewBag.ceco_id = bieninformatico.ceco_id;
            ViewBag.localidad_id = bieninformatico.localidad_id;

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", ceco_idV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", DivisionIdV);

            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 4);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }


        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // TransferenciaM()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar el movimiento de transferencia        *//
        // de un BI.  Método GET.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para el movimiento de transferencia	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult TransferenciaM(string id)
        {
            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();
            
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);


            ViewBag.nombre1 = (from m in db.Cargoes
                              where m.CargoId == bieninformatico.CargoId
                              select m.empleados).FirstOrDefault();

            bieninformatico.cubf = null;

            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion");
            ViewBag.localidad_id = "";

            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);

            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper");
            ViewBag.CargoId = "";
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // TransferenciaM()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar el movimiento de transferencia        *//
        // de un BI.  Método POST.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para el movimiento de transferencia	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult TransferenciaM(BienInformatico bieninformatico, 
                                            string nombre, 
                                            string nombre1, 
                                            string LocalidadIdV, 
                                            string ceco_idV, 
                                            string CargoIdV, 
                                            string DivisionIdV, 
                                            string ClaseIdV, /*correo*/
                                            string email, 
                                            string emailE, 
                                            string emailR, 
                                            string subject, 
                                            string body,/*correos*/
                                            string CargoId_Visible,
                                            string localidad_id_Visible
                                            )
        {

            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;

            var seriales = "Se trasladaron los Bienes Informáticos hijos, ";

                /*correo*/
                if (emailE != string.Empty && emailR != string.Empty && email != string.Empty)
                {

                    if (ModelState.IsValid)
                    {
                        var bieninformaticoP = (from m in db.BienInformaticoes
                                                where m.PadreId == bieninformatico.BienInformaticoId
                                                select m.BienInformaticoId).ToList();
                        var localidadN = (from m in db1.LOCALIDAD
                                          where m.localidad_id == bieninformatico.localidad_id
                                          select m.localidad_nombre).ToList();

                        if (bieninformaticoP.Count != 0)
                        {
                            foreach (var BienInformaticoIdAux in bieninformaticoP)
                            {
                                BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                                BienModf.EstadoId = 1;
                                BienModf.CargoId = bieninformatico.CargoId;
                                BienModf.ceco_id = bieninformatico.ceco_id;
                                BienModf.DivisionId = bieninformatico.DivisionId;
                                BienModf.localidad_id = bieninformatico.localidad_id;
                                BienModf.cubf = bieninformatico.cubf;

                                seriales = seriales + BienModf.BienInformaticoId + ", ";

                                db.Entry(BienModf).State = EntityState.Modified;
                            }

                            seriales = seriales + " a la localidad " + localidadN.FirstOrDefault() + ".";

                        }
                        else
                        {
                            seriales = string.Empty;
                        }

                        bieninformatico.PadreId = null;
                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.SaveChanges();

                        var cargoN = (from m in db.Cargoes
                                      where m.CargoId == bieninformatico.CargoId
                                      select m).ToList().FirstOrDefault();
                        var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                        // Carga Movimiento
                        creacionMovimiento("Entrada", obs + seriales, bieninformatico.cubf,
                                bieninformatico.localidad_id, 7,
                                    bieninformatico.BienInformaticoId);


                        //--------------------------------  Envio de Correo  ------------------------------\\
                        var msnCorreo = "";

                        var localidad = (from m in db1.LOCALIDAD
                                         where m.localidad_id == LocalidadIdV
                                         select m.localidad_nombre).ToList();


                        var cargo = (from c in db.Cargoes
                                     where c.CargoId == CargoIdV
                                     select c.cdes).ToList();

                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();
                        var emailSend = email + "," + emailE + "," + emailR;
                        var subjectSend = "Coordinación de Bienes Informáticos. " + subject;
                        var bodySend = " la Transferencia del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                       "' ubicado en la localidad " + localidad.FirstOrDefault() + " en el cargo " + cargo.FirstOrDefault() + ", a la localidad " + localidadN.FirstOrDefault() + ", para el cargo "
                                       + cargoN + ".  <br /><br />" + body;

                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                        try
                        {
                            if (bieninformatico.TipoBienId == 1)
                            {
                                var splitCorreos = cc.Split(',');
                                // Solo se permite el envio a Centro Soporte. No
                                // se desea enviar correo a Activo Fijo
                                cc = splitCorreos[0];
                            }

                            sendEmail(cc, subjectSend, bodySend, true);
                            if (envioCorreo) sendEmail(emailSend, subjectSend, bodySend, true);
                            msnCorreo = "Se envió el correo satisfactoriamente";
                        }
                        catch (Exception)
                        {
                            msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                        }
                        //--------------------------------  FIN Envio de Correo  ------------------------------\\

                        return RedirectToAction("PreviewTransferenciaM", /*correo*/ new { id = bieninformatico.BienInformaticoId, msnCorreo = msnCorreo, seriales = seriales, LocalidadIdV = LocalidadIdV, CecoIdV = ceco_idV, CargoIdV = CargoIdV, DivisionIdV = DivisionIdV });
                    }
                }
                else
                    ViewBag.FailCorreo = "Debe Rellenar Correo";
            

            /*correo*/
            ViewBag.emailE = emailE;
            ViewBag.emailR = emailR;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

            ViewBag.nombre = nombre;
            ViewBag.nombre = nombre1;

            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            ViewBag.CargoId_Visible = CargoId_Visible;
            ViewBag.localidad_id_Visible = localidad_id_Visible;

            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = bieninformatico.localidad_id;

            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", ceco_idV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", DivisionIdV);

            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = bieninformatico.CargoId;
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // ResguardoReem()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar el resguardo por reemplazo            *//
        // de un BI.  Método GET.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para el resguardo por reemplazo 	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult ResguardoReem( string id, int tipoRes)
        {
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            bieninformatico.cubf = string.Empty;

            ViewBag.nombre = (from m in db.Cargoes
                              where m.CargoId == bieninformatico.CargoId
                              select m.empleados).FirstOrDefault();

            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", "7280600000");
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.cecoIdV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.padreIdV = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.Correo = (from m in db.Cargoes where m.CargoId == bieninformatico.CargoId select m.correo).FirstOrDefault();

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", tipoRes);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", "0000");
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // ResguardoReem()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar el resguardo por reemplazo            *//
        // de un BI.  Método POST.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para el resguardo por reemplazo 	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult ResguardoReem( /*correos*/string email, string nombre, 
                        string emailSuper, string subject, 
                        string body/*correos*/, BienInformatico bieninformatico, 
                        string divisionIdV, string cecoIdV, 
                        string ubiIdV, string LocalidadIdV, 
                        string CargoIdV, int EstadoIdV, 
                        string ClaseIdV, int? padreIdV)
        {
          
            ModelState.Remove("padreIdV");
            ModelState.Remove("PadreId");
            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;

             /*correo*/
            if (email != string.Empty)
            {
                if ( emailSuper != string.Empty)
                {        
                    if (ModelState.IsValid)
                    {  

                        bieninformatico.PadreId = null;
                        db.Entry(bieninformatico).State = EntityState.Modified;
                        db.SaveChanges();

                        var cargoN = (from m in db.Cargoes
                                      where m.CargoId == bieninformatico.CargoId
                                      select m).ToList().FirstOrDefault();
                        var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                        // Carga Movimiento
                        creacionMovimiento("Salida", obs, bieninformatico.cubf,
                                bieninformatico.localidad_id, bieninformatico.EstadoId,
                                    bieninformatico.BienInformaticoId);

                        //--------------------------------  Envio de Correo  ------------------------------\\
                        var msnCorreo = "";

                        var localidad = (from m in db1.LOCALIDAD
                                         where m.localidad_id == LocalidadIdV
                                         select m.localidad_nombre).ToList();

                        var cargo = (from c in db.Cargoes
                                     where c.CargoId == CargoIdV
                                     select c.cdes).ToList();

                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();

                        var emailSend = email + "," + emailSuper;
                        var subjectSend = "Coordinación de Bienes Informáticos. Paso 1 Reemplazo. " + subject;
                        var bodySend = " el Resguardo del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                       "' a Depósito, que estaba en la localidad " + localidad.FirstOrDefault() +
                                       ", asignado al cargo " + cargo.FirstOrDefault() + ".  <br /><br />" + body;

                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                        try
                        {
                            sendEmail(cc, subjectSend, bodySend, true);
                            if (envioCorreo) sendEmail(emailSend, subjectSend, bodySend, true);
                            msnCorreo = "Se envió el correo satisfactoriamente";
                        }
                        catch (Exception e)
                        {
                            msnCorreo = e.ToString();//"No se pudo enviar el correo debido a problemas con el servidor";
                        }
                        //--------------------------------  FIN Envio de Correo  ------------------------------\\

                        return RedirectToAction("MovimientoAsignacionReem", new { idRes = bieninformatico.BienInformaticoId, cargoRes = CargoIdV, cecoRes = cecoIdV, divisionRes = divisionIdV, localidadRes = LocalidadIdV, ubiRes = ubiIdV, padreRes = padreIdV, ClaseRes = ClaseIdV, /*correo*/ correoRes = email, msnCorreo = msnCorreo });
                    }
                }else
                    ViewBag.FailCorreoS = "Debe Rellenar Correo del Supervisor";
            }else
                ViewBag.FailCorreoU = "Debe Rellenar Correo de Usuario";

            /*correo*/
            ViewBag.email = email;
            ViewBag.emailSuper = emailSuper;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

            ViewBag.nombre = nombre;

            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", "0002");

            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.cecoIdV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", cecoIdV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.padreIdV = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", padreIdV);

            ViewBag.ClaseIdV = ClaseIdV;
            ViewBag.Correo = (from m in db.Cargoes where m.CargoId == bieninformatico.CargoId select m.correo).FirstOrDefault();

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 2);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(db.Cargoes, "CargoId", "cdes", "DEPOSITO");
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // AsignacionReem()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar la asignacion por reemplazo           *//
        // de un BI.  Método GET.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para la asignacion por reemplazo 	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        public ActionResult AsignacionReem( string id, string idRes, 
                        string cargoRes, string cecoRes, 
                        string divisionRes, string localidadRes, 
                        string ubiRes, int? padreRes, 
                        string correoRes)
        {
            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();
            
            BienInformatico bieninformatico = db.BienInformaticoes.Find(id);

            bieninformatico.cubf = ubiRes;

            ViewBag.nombre = (from m in db.Cargoes
                              where m.CargoId == cargoRes
                              select m.empleados).FirstOrDefault();

            ViewBag.idRes = idRes;

            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId",padreRes);/**/
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion",cecoRes);/**/
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre",localidadRes);/**/

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", bieninformatico.EstadoId);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", bieninformatico.localidad_id);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);

            ViewBag.ClaseIdV = bieninformatico.nmym.ncob.cnom;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper",divisionRes);/**/
            ViewBag.CargoId = new SelectList(cargos, "CargoId", "cdes", cargoRes);/**/
            ViewBag.email = correoRes;/**/
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  										                       				*//
        //***********************************************************************************//
        // AsignacionReem()	Acceso solo ADMINISTRADOR			    		    			*//
        // Acción que devuelve la vista para realizar la asignacion por reemplazo           *//
        // de un BI.  Método POST.	                                                        *//
        // _________________________________________________________________________________*//
        // Entrada: none																	*//
        // _________________________________________________________________________________*//
        // Salida:  Vista que devuelve la plantilla para la asignacion por reemplazo 	    *//
        // _________________________________________________________________________________*//
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult AsignacionReem(BienInformatico bieninformatico, string idRes, 
                        /*correo*/string email, string subject, 
                                string body/*correos*/, string LocalidadIdV, 
                                string ceco_idV, int EstadoIdV, 
                                string ClaseIdV, string DivisionIdV, 
                                string CargoIdV)
        {
            
            ModelState.Remove("ClaseIdV");
            var envioCorreo = false;

            var HijosChange = "Se cambiaron los siguientes Hijos ";
            /*correo*/
            if (email != string.Empty)
            {

                if (ModelState.IsValid)
                {

                    var bieninformaticoP = (from m in db.BienInformaticoes
                                            where m.PadreId == idRes
                                            select m.BienInformaticoId).ToList();

                    if (bieninformaticoP.Count != 0)
                    {
                        foreach (var BienInformaticoIdAux in bieninformaticoP)
                        {
                            BienInformatico BienModf = db.BienInformaticoes.Find(BienInformaticoIdAux);
                            BienModf.PadreId = bieninformatico.BienInformaticoId;

                            db.Entry(BienModf).State = EntityState.Modified;

                            HijosChange = HijosChange + BienModf.BienInformaticoId + ", ";
                        }
                        HijosChange = HijosChange + " con el nuevo padre " + bieninformatico.BienInformaticoId + ".";

                    }
                    else {
                        HijosChange = "";
                    }

                    db.Entry(bieninformatico).State = EntityState.Modified;
                    db.SaveChanges();

                    var cargoN = (from m in db.Cargoes
                                  where m.CargoId == bieninformatico.CargoId
                                  select m).ToList().FirstOrDefault();
                    var obs = "Cargo involucrado en movimiento. " + cargoN.cdes.Replace('.', ' ') + ", " + cargoN.empleados.Replace('.', ' ') + "."; 

                    // Carga Movimiento
                    creacionMovimiento("Entrada", obs, bieninformatico.cubf,
                            bieninformatico.localidad_id, bieninformatico.EstadoId,
                                bieninformatico.BienInformaticoId);

                        //--------------------------------  Envio de Correo  ------------------------------\\
                        var msnCorreo = "";

                        var localidad = (from m in db1.LOCALIDAD
                                         where m.localidad_id == bieninformatico.localidad_id
                                         select m.localidad_nombre).ToList();

                        var cargo = (from c in db.Cargoes
                                     where c.CargoId == bieninformatico.CargoId
                                     select c.cdes).ToList();
                        //Obtención de la marca modelo
                        var marcaModelo = (from c in db.MarcaModeloes
                                           where c.MarcaModeloId == bieninformatico.MarcaModeloId
                                           select c.ncob.cnom).ToList();

                        var subjectSend = "Coordinación de Bienes Informáticos. Paso 2 Reemplazo. " + subject;
                        var bodySend = " el traslado del Bien Informático de tipo " + marcaModelo.FirstOrDefault() + ", con serial '" + bieninformatico.BienInformaticoId +
                                       "' a la localidad " + localidad.FirstOrDefault() + ", asignado al cargo "
                                       + cargo.FirstOrDefault() + ".  <br /><br />" + body;

                        var cc = (from m in db.ControlCorreos
                                  where m.CausaMovimientoId == bieninformatico.EstadoId
                                  select m.ccor).First();

                        if (email != String.Empty && subject != String.Empty && body != String.Empty) envioCorreo = true;
                        try
                        {
                            sendEmail(cc, subjectSend, bodySend, true);
                            if (envioCorreo) sendEmail(email, subjectSend, bodySend, true);
                            msnCorreo = "Se envió el correo satisfactoriamente";
                        }
                        catch (Exception)
                        {
                            msnCorreo = "No se pudo enviar el correo debido a problemas con el servidor";
                        }
                        //--------------------------------  FIN Envio de Correo  ------------------------------\\

                        return RedirectToAction("PreviewReemplazoM", /*correo*/ new { id = bieninformatico.BienInformaticoId, idRes = idRes, msnCorreo = msnCorreo, HijosChange = HijosChange, LocalidadIdV = LocalidadIdV, CecoIdV = ceco_idV, CargoIdV = CargoIdV, DivisionIdV = DivisionIdV });
                }
            }
            else
                ViewBag.FailCorreo = "Debe Rellenar Correo";

            /*correo*/
            ViewBag.email = email;
            ViewBag.subject = subject;
            ViewBag.body = body;
            /*correo*/

            var cargos = (from c1 in db.Cargoes
                          where c1.CargoId != "DEPOSITO"
                          select c1).ToList();

            ViewBag.email = email;
            ViewBag.PadreId = new SelectList(db.BienInformaticoes, "BienInformaticoId", "BienInformaticoId", bieninformatico.PadreId);
            ViewBag.ceco_id = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", bieninformatico.ceco_id);
            ViewBag.localidad_id = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre");

            ViewBag.EstadoIdV = new SelectList(db.Estadoes, "EstadoId", "cnom", EstadoIdV);
            ViewBag.ceco_idV = new SelectList(db1.CECO, "ceco_id", "ceco_descripcion", ceco_idV);
            ViewBag.LocalidadIdV = new SelectList(db1.LOCALIDAD, "localidad_id", "localidad_nombre", LocalidadIdV);
            ViewBag.CargoIdV = new SelectList(db.Cargoes, "CargoId", "cdes", CargoIdV);
            ViewBag.DivisionIdV = new SelectList(db.Divisions, "DivisionId", "cper", DivisionIdV);

            ViewBag.ClaseIdV = ClaseIdV;

            ViewBag.EstadoId = new SelectList(db.Estadoes, "EstadoId", "cnom", 1);
            ViewBag.TipoBienId = new SelectList(db.TipoBiens, "TipoBienId", "cnom", bieninformatico.TipoBienId);
            ViewBag.SociedadId = new SelectList(db.Sociedads, "SociedadId", "cscc", bieninformatico.SociedadId);
            ViewBag.DivisionId = new SelectList(db.Divisions, "DivisionId", "cper", bieninformatico.DivisionId);
            ViewBag.CargoId = new SelectList(cargos, "CargoId", "cdes", bieninformatico.CargoId);
            ViewBag.MarcaModeloId = new SelectList(db.MarcaModeloes, "MarcaModeloId", "cmod", bieninformatico.MarcaModeloId);
            return View(bieninformatico);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // sendEmail()		Acceso solo ADMINISTRADOR										*//
        // Función que se encarga de enviar los correos del sistema							*//														 			
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	cc: Lista de correso separados por , a los cuales se desea enviar el mensaje*//
        // •	subject: subject que se va a enviar con el correo							*//	
        // •	body: cuerpo que se va a enviar con el correo								*//	
        // •	isBodyHtml: cboleano que dice si el cuerpo del correo es en formatao HTML	*//		
        // _________________________________________________________________________________*//
        // Salida:  Devuelve el envio de correo.											*//
        // _________________________________________________________________________________*//
        public void sendEmail(string cc, string subject, string body, bool isBodyHtml)
        {
            //Creación del objeto para enviar correo electronicos
            var mailMessage = new System.Net.Mail.MailMessage();

            string header = "Buen día, <br /><br />La Coordinación de Bienes Informáticos realizó ";
            //Colocando el destinatario del correo
            mailMessage.To.Add(cc);
            //Estableciendo que el cuerpo del correo es en el formato Html
            mailMessage.IsBodyHtml = isBodyHtml;
            //Título del correo
            mailMessage.Subject = subject;
            //Mensaje del correo
            //Colocando el remitente del correo
            mailMessage.From = new MailAddress("admin_sibi@monaca.com.ve");

            // --------------------- op 1 -------------- //
            string footer = "<br /><br /><div style=\"font-size:14px\" >Este mensaje fue enviado automáticamente por el sistema SIBI. <br /><hr /><br />" +
                          "<table style=\"font-size:14px\" border=\"0\">" +
                            "<tr>" +
                            "<td>Johanna Medina</td>" +
                            "<td>Beatriz Olmedillo</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>Administrador de Bienes Informáticos &nbsp; </td>" +
                            "<td>Coordinación de Bienes Informáticos</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>+58 (212)2079385</td>" +
                            "<td>+58(212)2079269</td>" +
                            "</tr>" +
                            "<tr>" +
                            "<td>jmmedina@monaca.com.ve</td>" +
                            "<td>bolmedillo@monaca.com.ve</td>" +
                            "</tr>" +
                          "</table><br /></div>" +
                          "<img src=\"@@IMAGE@@\" alt=\"\">";


            //string attachmentPath =  @"\comprometidosconmonaca.png";
            string path = Server.MapPath(@"~\Content\images\comprometidosconmonaca.png");

            //generate the contentID string using the datetime
            string contentID = Path.GetFileName(path).Replace(".", "") + "@zofm";

            //create the INLINE attachment<
            Attachment inline = new Attachment(path);
            inline.ContentDisposition.Inline = true;
            inline.ContentDisposition.DispositionType = DispositionTypeNames.Inline;
            inline.ContentId = contentID;
            inline.ContentType.MediaType = "image/png";
            inline.ContentType.Name = Path.GetFileName(path);
            mailMessage.Attachments.Add(inline);

            // replace the tag with the correct content ID
            footer = footer.Replace("@@IMAGE@@", "cid:" + contentID);
            mailMessage.Body = header + body + footer;

            //Envio del correo.
            SmtpClient mailSender = new SmtpClient(); //use this if you are in the development server
            mailSender.Send(mailMessage);
        }

        //***********************************************************************************//
        // Autor:  									                	     				*//
        //***********************************************************************************//
        // creacionMovimiento()		                        							    *//
        // Función que se encarga de realizar los movimientos       						*//
        // _________________________________________________________________________________*//
        // Entrada: 																		*//
        // •	tipoMov: Tipo de movimiento que se esta realizando. Entrada/Salida          *//
        // •	observacion: Observacion que se desea colocar                               *// 
        // •	ubicacionF: Ubicacion fisica en el que queda el BI                          *//
        // •	localidad: Localidad en la que va a estar el BI                             *//	
        // •	causaMov: Causa movimiento, Revision, Asignacion, Resguardo, Mantenimiento  *//
        // •	serial: Serial del BI que realizó el movimiento                             *//
        // _________________________________________________________________________________*//
        // Salida:  Realiza el movimiento dependiendo de los parametros colocados			*//
        // _________________________________________________________________________________*//
        private void creacionMovimiento(string tipoMov, string observacion,
                            string ubicacionF, string localidad,
                            int causaMov, string serial)
        {

            Movimiento movimiento = new Movimiento
            {
                dmov = DateTime.Now.Date,
                dfmo = DateTime.Now.Date,
                ctmo = tipoMov,
                cobs = observacion,
                cubf = ubicacionF,
                localidad_id = localidad,
                CausaMovimientoId = causaMov,
                BienInformaticoId = serial
            };
            db.Movimientoes.Add(movimiento);

            db.SaveChanges();
        }

        protected override void Dispose(bool disposing)
        {
            db.Dispose();
            base.Dispose(disposing);
        }
    }
}